﻿// Apple Catching POJ - 2385.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-2385

/*
众所周知，奶牛喜欢吃苹果。农夫约翰的田里有两棵苹果树（编号分别为 1 号和 2 号），每棵树上都结满了苹果。
苹果挂在树上时，贝西够不着，所以她必须等着苹果掉下来。不过，她必须在空中接住苹果，因为苹果落地时会碰伤（没有人想吃碰伤的苹果）。
贝西吃东西很快，所以她接住的苹果只需几秒钟就会被吃掉。

每隔一分钟，两棵苹果树上就会掉下一个苹果。贝西经过多次练习，只要站在掉下苹果的树下，就能接住苹果。
虽然贝西可以在两棵树之间快速行走（远少于一分钟），但她在任何时候都只能站在一棵树下。
此外，牛的运动量不大，所以它不愿意在两棵树之间无休止地来回走动（因此错过了一些苹果）。

苹果在 T（1 <= T <= 1,000）分钟内掉落（每分钟一个）。贝西最多愿意来回走 W (1 <= W <= 30) 次。
如果哪棵树每分钟会掉下一个苹果，请确定贝西最多能抓多少个苹果。贝西从第 1 棵树开始。

输入
* 第 1 行： 两个空格分隔的整数 T 和 W

* 第 2...T+1 行：1 或 2：每分钟会掉落一个苹果的树。
输出
* 第 1 行 贝西在行走不超过 W 次的情况下最多可以抓多少个苹果。
样本
输入复制 输出复制
7 2
2
1
1
2
2
1
1

2 5
2
1


6
提示
输入细节：

贝西愿意从一棵树走到另一棵树两次。

输出详情：

贝西可以在 1 号树下抓到六个苹果，直到前两个苹果掉下来，然后移到 2 号树下抓到后两个苹果，再回到 1 号树下抓到最后两个苹果。
*/

const int N = 1010;
int dp[3][N][35];		//dp[x][y][z] 站在x树下第Y秒 移动了z次接到的最多苹果数
int arr[N];
int t, w;

int main()
{
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < 35; k++) {
				dp[i][j][k] = -99999999;
			}
		}
	}
	dp[1][0][0] = 0;
	cin >> t >> w;

	for (int i = 1; i <= t; i++) {
		cin >> arr[i]; int oneadd = 0; int twoadd = 0;
		if (arr[i] == 1) {	oneadd++;}
		else {	twoadd++;}
	
		for (int j = 0; j <= w; j++) {
			dp[1][i][j] = dp[1][i-1][j]+ oneadd;
			if (j > 0) {
				dp[1][i][j] = max(dp[1][i][j], dp[2][i - 1][j - 1]+ oneadd);
			}
			dp[2][i][j] = dp[2][i-1][j] + twoadd;
			if (j > 0) {
				dp[2][i][j] = max(dp[2][i][j], dp[1][i - 1][j - 1]+ twoadd);
			}

		}
	}
	int ans = 0;
	for (int i = 0; i <= w; i++) {
		ans = max(ans, dp[1][t][i]);
		ans = max(ans, dp[2][t][i]);
	}
	cout << ans << endl;

	return 0;
}

 